package br.com.dlm.simuladoitil.controle;

import android.content.Context;

import org.json.JSONException;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

import br.com.dlm.simuladoitil.basicas.Alternativa;
import br.com.dlm.simuladoitil.basicas.Categoria;
import br.com.dlm.simuladoitil.basicas.Questao;

public class GerenciadorConteudo {

    private RepositorioLocal local;
    private RepositorioNuvem nuvem;

    private HashMap hashMap;

    private static GerenciadorConteudo instancia;

    private GerenciadorConteudo(Context context) {
        local = new RepositorioLocal(context);
        nuvem = new RepositorioNuvem();

        hashMap = new HashMap();
    }

    public static GerenciadorConteudo getInstancia(Context context) {
        if (instancia == null) {
            instancia = new GerenciadorConteudo(context);
        }
        return instancia;
    }

    public List<Categoria> listarCategorias() {
        return local.listarCategorias();
    }

    public List<Questao> obterQuestoesDaRodada(Categoria categoria) {
        List<Questao> questoesSelecionadas = categoria.getQuestoesNaoRespondidas(10);

        if (questoesSelecionadas.size() < 10) {
            Random random = new Random();

            List<Questao> questoesJaRespondidas = categoria.getQuestoesRespondidas();

            int quantidadeDeQuestoesJaRespondidas = questoesJaRespondidas.size();
            int quantidadeDeQuestoesJaRespondidasAdicionadas = 0;

            while (questoesSelecionadas.size() < 10 && quantidadeDeQuestoesJaRespondidas != quantidadeDeQuestoesJaRespondidasAdicionadas) {
                Questao questao = questoesJaRespondidas.get(random.nextInt(quantidadeDeQuestoesJaRespondidas));

                if (!questoesSelecionadas.contains(questao)) {
                    questoesSelecionadas.add(questao);
                    quantidadeDeQuestoesJaRespondidasAdicionadas++;
                }
            }
        }

        return questoesSelecionadas;
    }

    public List<Questao> atualizarMudancasNasQuestoes(List<Questao> questoes) {
        List<Questao> questoesAtualizadas = new ArrayList<Questao>();

        int quantidadeDeQuestoes = questoes.size();

        for (int indexQuestao = 0; indexQuestao < quantidadeDeQuestoes; indexQuestao++) {
            questoesAtualizadas.add(local.consultarQuestaoPorId(questoes.get(indexQuestao).id));
        }

        return questoesAtualizadas;
    }

    public void atualizarConteudoLocal() throws JSONException, IOException, RuntimeException {
        List<Categoria> categoriasLocal = local.listarCategorias();
        List<Categoria> categoriasNuvem = nuvem.obterArquivoJSON().categorias;

        for (Categoria categoriaNuvem : categoriasNuvem) {
            if (categoriasLocal.contains(categoriaNuvem)) {
                for (Questao questaoNuvem : categoriaNuvem.questoes) {
                    if (categoriasLocal.get(categoriasLocal.indexOf(categoriaNuvem)).questoes.contains(questaoNuvem)) {
                        for (Alternativa alternativaNuvem : questaoNuvem.alternativas) {
                            if (!categoriasLocal.get(categoriasLocal.indexOf(categoriaNuvem)).questoes.get(categoriasLocal.get(categoriasLocal.indexOf(categoriaNuvem)).questoes.indexOf(questaoNuvem)).alternativas.contains(alternativaNuvem)) {
                                local.inserirAlternativa(alternativaNuvem, questaoNuvem);
                            }
                        }
                    } else {
                        local.inserirQuestao(questaoNuvem, categoriaNuvem);
                    }
                }
            } else {
                local.inserirCategoria(categoriaNuvem);
            }
        }

        for (Categoria categoriaNuvem : categoriasNuvem) {
            if (!local.consultarCategoriaPorId(categoriaNuvem.id).checarMudancasAtributos(categoriaNuvem)) {
                local.alterarCategoria(categoriaNuvem);
            }
            for (Questao questaoNuvem : categoriaNuvem.questoes) {
                if (!local.consultarQuestaoPorId(questaoNuvem.id).checarMudancasAtributos(questaoNuvem)) {
                    local.alterarQuestao(questaoNuvem, categoriaNuvem);
                }
                for (Alternativa alternativaNuvem : questaoNuvem.alternativas) {
                    if (!local.consultarAlternativaPorId(alternativaNuvem.id).checarMudancasAtributos(alternativaNuvem)) {
                        local.alterarAlternativa(alternativaNuvem, questaoNuvem);
                    }
                }
            }
        }
    }

    public List<Questao> consultarQuestoesPorCategoria(Categoria categoria) {
        return local.consultarQuestoesPorCategoria(categoria);
    }

    public Alternativa consultarAlternativaPorId(String id){
        return local.consultarAlternativaPorId(id);
    }

    public void alterarQuestao(Questao questao, Categoria categoria){
        local.alterarQuestao(questao, categoria);
    }

    public void putObjeto(String identificador, Object objeto) {
        hashMap.put(identificador, objeto);
    }

    public Object getObjeto(String identificador) {
        return hashMap.get(identificador);
    }

    public void limparObjetos() {
        hashMap.clear();
    }

}
